package com.cskaoyan.javase.array._5operation._0traverse;

/**
 * 数组的遍历
 * 数组的遍历（traverse）是最最基本的操作，是进行数组中其它操作的基础。
 *
 * 这里我们先手动实现一下:
 *      遍历并打印数组中的每一个元素
 *
 * @since 14:58
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6};
        /*System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        // 使用for循环遍历数组的快捷键 数组名.fori
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }*/
        // arr = new int[0];
        arr = null;
        traverse7(arr);
    }

    public static void traverse(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    /*
        优化数组的遍历打印元素,使得格式更加美观
        对于数组,希望输出的格式是: [1, 2, 3]
     */
    public static void traverse2(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.print("]");
    }

    /*
        改进:
        最后一个元素也加了逗号的问题,有两个选择:
            1.转义字符"\b"退格
            2.if判断,最后一个元素不加逗号
     */
    public static void traverse3(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            // 判断如果是最后一个元素,就不加逗号
            if (i == arr.length - 1) {
                System.out.print(arr[i]);
                break;
            }
            System.out.print(arr[i] + ", ");
        }
        System.out.print("]");
    }

    public static void traverse4(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.print("\b\b]");
    }
    /*
        上述所有的方法,都只能接受正常的数组对象输入
        但是数组还有不正常的情况,比如:
            1.长度为0的数组
            2.null数组
        所以需要更进一步优化
     */

    /*
        优化,使得方法能够接受长度为0的数组的输入
        优化的方向是:
            一旦用户输入长度为0的数组
            那就给出用户的友好的提示,不打印任何其它信息
      */
    public static void traverse5(int[] arr) {
        /*
            写if的时候
            为了让代码可读性更好
            应该让尽可能少的代码出现在if选择大括号内部
            应该让尽量简单的逻辑出现在if大括号内部

            这里应该是判断不正常的情况会更好
         */
        if (arr.length == 0) {
            System.out.println("您输入的是一个长度为0的数组,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.print("\b\b]");
    }

    /*
        优化,使得方法能够接收null数组的输入
        优化的方向是:
            一旦用户输入null数组
            那就给出用户的友好的提示,不打印任何其它信息
     */
    public static void traverse6(int[] arr) {
        if (arr == null) {
            System.out.println("您输入的是一个null数组,请重新输入!");
            return;
        }
        if (arr.length == 0) {
            System.out.println("您输入的是一个长度为0的数组,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.print("\b\b]");
    }

    /*
        改进:
            要求同时处理null和长度为0的数组
            统归为处理不正常数组
     */
    public static void traverse7(int[] arr) {
        // 固定写法,标准格式
        if (arr == null || arr.length == 0){
            System.out.println("您输入的不是正常数组,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.print("\b\b]");
    }
}
